package ar.com.ctrln.view.dashboard.mantenimiento.ticket;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.DropEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Row;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timebox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.compras.RegistrarPedidoCompra;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarActividad;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarTicket;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.compra.PedidoCompra;
import ar.com.ctrln.persistence.model.insumo.Insumo;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.persistence.model.ticket.EstadoTicket;
import ar.com.ctrln.persistence.model.ticket.Ticket;
import ar.com.ctrln.persistence.model.ticket.TipoTicket;
import ar.com.ctrln.persistence.model.ticket.actividad.Actividad;
import ar.com.ctrln.persistence.model.ticket.actividad.DetalleActividad;
import ar.com.ctrln.persistence.model.vehiculo.Vehiculo;
import ar.com.ctrln.view.render.mantenimiento.actividad.DetActividadItemRender;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarActividadController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private RegistrarActividad registrarActividad;
	
	@WireVariable
	private RegistrarPedidoCompra registrarPedidoCompra;

	private Ticket ticket;

	private Insumo insumo;

	private Actividad actividad;

	private Set<DetalleActividad> listaDetalles;
	
	private List<PedidoCompra> listaPedidos;

	private DetalleActividad detalle;

	private Cliente emisor;
	
	private Window insumosWin;

	boolean flagElimino = false;
	
	private EventQueue eqA = (EventQueue) EventQueues.lookup("cantInsumos",EventQueues.DESKTOP, true);
	
	private EventQueue eqA1 = (EventQueue) EventQueues.lookup("descontarInsumos",EventQueues.DESKTOP, true);
	
	private EventQueue eqA2 = (EventQueue)EventQueues.lookup("devolverInsumos",EventQueues.DESKTOP, true);
	
	private EventQueue eqA3 = (EventQueue)EventQueues.lookup("closeInsumos",EventQueues.DESKTOP, true);
	
	private EventQueue act = (EventQueue) EventQueues.lookup("actulizarLista",EventQueues.DESKTOP, true);


	@Wire
	private Window wRegistrarActividad;
	
	@Wire
	private Div btnCancelarActividad;

	@Wire
	private Timebox tbInicio;

	@Wire
	private Timebox tbFin;

	@Wire
	private Datebox dbFechaIni;

	@Wire
	private Datebox dbFechaFin;

	@Wire
	private Checkbox chkVehiculo;

	@Wire
	private Row rowVehiculo;
	
	@Wire
	private Image iAgregarDetalle;
	
	@Wire
	private Image iEliminarDetalle;

	@Wire
	private Textbox tbNroTicket;

	@Wire
	private Textbox tbNombreAct;

	@Wire
	private Label lGuardarModificar;

	@Wire
	private Listbox lbDetActividades;

	@Wire
	private Textbox tbDescripcion;

	@Wire
	private Combobox cboVehiculo;
	
	@Wire
	private Popup popupExito;

	@Wire
	private Popup popup;

	@Wire
	private Label popText;

	@Wire
	private Timer timer;

	private Toolkit toolkit;

	private Dimension scrnsize;
	
	@SuppressWarnings({ "unchecked" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		actividad = new Actividad();
		Clients.showNotification("Presione para asignar insumos a la actividad",Clients.NOTIFICATION_TYPE_INFO, iAgregarDetalle, "end_center", 6000);
		Clients.showNotification("Puede eliminar los insumos no deseados",Clients.NOTIFICATION_TYPE_INFO, iEliminarDetalle, "start_center", 6000);

		listaPedidos=new ArrayList<PedidoCompra>();
		eqA.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				boolean existeIns = false;
				detalle = new DetalleActividad(insumo, (Integer) event
						.getData());
				if ((Integer) event.getData() > insumo.getStock()) {
					PedidoCompra pedido= new PedidoCompra();
					pedido.setInsumo(insumo);
					pedido.setCantidad((Integer) event.getData()-insumo.getStock());
					boolean isPedido=false;
					for(PedidoCompra nota : listaPedidos){
						if(nota.getInsumo()==pedido.getInsumo()){
							nota.setCantidad(nota.getCantidad()+(Integer) event.getData());
							isPedido=true;
						}
					}
					if(!isPedido)listaPedidos.add(pedido);
				} 
				for (DetalleActividad det : listaDetalles) {
					if (det.getInsumo().getNombre() == insumo.getNombre()) {
						det.setCantidad(det.getCantidad()
								+ (Integer) event.getData());
						existeIns = true;
					}
				}
				if (!existeIns) {
					listaDetalles.add(detalle);
					existeIns = false;
				}
				lbDetActividades.setModel(new ListModelList<DetalleActividad>(listaDetalles));
				eqA1.publish(new Event("onButtonClick", null, detalle));
				
				insumo=null;
				detalle=null;
			}
			
		});
	
			Date horaInicio = format.parse("09:00");
			Date horaFin = format.parse("18:00");
			tbInicio.setValue(horaInicio);
			tbFin.setValue(horaFin);
			dbFechaIni.setValue(new Date());
			dbFechaFin.setValue(new Date());

		
		ticket = (Ticket) Executions.getCurrent().getArg().get("ticket");
		tbNroTicket.setValue(String.valueOf(ticket.getId()));
		lbDetActividades.setItemRenderer(new DetActividadItemRender());
		listaDetalles = new HashSet<DetalleActividad>();//new ArrayList<DetalleActividad>();
		lbDetActividades.setModel(new ListModelList<DetalleActividad>(listaDetalles));
		cboVehiculo.setModel(new ListModelList<Vehiculo>(registrarActividad.listaVehiculo()));    

	}
	
	@Listen("onClick = #btnRegistrarActividad")
	public void registrarActividad() {
		
		actividad.setDescripcion(tbDescripcion.getText());
		actividad.setEstado(Actividad.ESTADO_CREADA);
		actividad.setFechaInicio(dbFechaIni.getValue());
		actividad.setFechaFin(dbFechaFin.getValue());
		actividad.setHoraInicio(tbInicio.getText());
		actividad.setHoraFin(tbFin.getText());
		actividad.setNombre(tbNombreAct.getText());
		actividad.setTicket(ticket);
		ticket.getActividades().add(actividad);
		if (chkVehiculo.isChecked() && cboVehiculo.getSelectedIndex()!=-1)
				actividad.setVehiculo((Vehiculo) cboVehiculo.getModel().getElementAt(cboVehiculo.getSelectedIndex()));
		actividad.setDetalles(listaDetalles);
		registrarActividad.guardarActividad(actividad);
		///////////PEDIDO DE INSUMOS FALTANTES///////////////
		Insumo ins;
		for(DetalleActividad det : listaDetalles){
			ins = det.getInsumo();
			//ins.setStock(ins.getStock()-det.getCantidad());
			registrarActividad.actualizarInsumos(ins);
		}
		for(PedidoCompra ped : listaPedidos){
			ped.setFechaAlta(new Date());
			ped.setFechaPref(dbFechaIni.getValue());
			ped.setEstado(PedidoCompra.ESTADO_PENDIENTE);
			registrarPedidoCompra.guardarPedido(ped);
		}
		salirActividad();	
		Clients.showNotification("La Actividad se registro con exito!",Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);
		//Clients.showNotification("Se han enviado las correspondientes notas de pedido a Compras",Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);

		popup.close();
	}

	@Listen("onClick = #chkVehiculo")
	public void mostrarVehiculo() {
		if (chkVehiculo.isChecked())
			rowVehiculo.setVisible(true);
		else
			rowVehiculo.setVisible(false);
	}

	@Listen("onClick = #iAgregarDetalle")
	public void agregarDetalle() {
		 insumosWin = (Window)Executions.createComponents(
				"/zul/mantenimiento/tickets/registrarDetalleActividad.zul",
				wRegistrarActividad, null);
	}

	@SuppressWarnings({ "unchecked" })
	@Listen("onClick = #iEliminarDetalle")
	public void borrarDetalle() {
		eqA2.publish(new Event("onButtonClick", null,(DetalleActividad)lbDetActividades.getSelectedItem().getValue()));
		listaDetalles.remove(lbDetActividades.getSelectedItem().getValue());
		lbDetActividades.setModel(new ListModelList<DetalleActividad>(
				listaDetalles));
	}

	@Listen("onChange = #dbFechaIni")
	public void checkFechaInicio() {
		checkFecha();
	}

	@Listen("onChange = #dbFechaFin")
	public void checkFechafin() {
		checkFecha();
	}

	@Listen("onDrop = #lbDetActividades")
	public void move(DropEvent event) {
		Listitem draggedListitem = (Listitem) event.getDragged();
		insumo = (Insumo) draggedListitem.getAttribute("data");
		Executions.createComponents("/zul/mantenimiento/tickets/cantDetalleInsumo.zul",wRegistrarActividad, null);
	}

	public void checkFecha() {

		Long inicio = ((Date) dbFechaIni.getValue()).getTime();
		Long fin = ((Date) dbFechaFin.getValue()).getTime();
		if (inicio > fin) {
			Clients.showNotification("La fecha de finalizacion debe ser mayor a la de inicio",Clients.NOTIFICATION_TYPE_WARNING, null, "middle_center",3500);
			dbFechaFin.setValue(dbFechaIni.getValue());
		}
	}

	@SuppressWarnings({ "unchecked" })
	@Listen("onClick = #btnCancelarActividad")
	public void salirActividad() {
	 eqA.close();
	 listaDetalles.clear();
   	 eqA3.publish(new Event("onButtonClick",null,null)); 
	 Executions.getCurrent().getSession().setAttribute("ListaActual",null);
	 wRegistrarActividad.onClose();
	}

}
